與托管在傳統服務器或虛擬機上的應用程序相比,無服務器計算和容器都使開發人員能夠以更少的開銷和更大的靈活性構建應用程序。開發人員應該使用哪種架構風格取決于應用程序的需求,但無服務器應用程序更具可擴展性并且通常更具成本效益。
什么是容器?
容器“包含”應用程序和應用程序正常運行所需的所有元素,包括系統庫、系統設置和其他依賴項。就像“只需加水”的煎餅混合物一樣,容器只需要一件事——托管和運行——就可以執行它們的功能。
任何類型的應用程序都可以在容器中運行。無論托管在哪里,容器化應用程序都將以相同的方式運行。集裝箱可以很容易地在任何需要的地方移動和部署,就像物理運輸集裝箱一樣,它是標準尺寸的,因此可以通過各種運輸工具(輪船、卡車、火車等)運輸到任何地方,無論其內容如何。
用技術術語來說,容器是一種將機器或服務器劃分為單獨的用戶空間環境的方法,這樣每個環境只運行一個應用程序,并且不與機器上的任何其他分區部分進行交互。每個容器與其他容器共享機器的內核(內核是操作系統的基礎,它與計算機的硬件交互),但它就像機器上唯一的系統一樣運行。
容器與虛擬機
甲虛擬機是一個軟件模仿一個完整的計算機系統。它與托管它的機器的其余部分隔離,并且表現得好像它是其上唯一的操作系統,包括擁有自己的內核。虛擬機是在一臺服務器上托管多個環境的另一種常見方式,但它們比容器使用更多的處理能力。
什么是無服務器計算?
無服務器應用程序被分解為功能,并由第三方供應商托管,該供應商僅根據每個功能運行的時間量向應用程序開發人員收費。有關無服務器計算的更多信息,請參閱什么是無服務器計算?
無服務器計算和容器之間的主要區別是什么?
物理機器
“無服務器”計算實際上在服務器上運行,但由無服務器供應商根據應用程序的需要來提供服務器空間;沒有為給定的功能或應用程序分配特定的機器。另一方面,每個容器一次都存在于一臺機器上并使用該機器的操作系統,但如果需要,它們可以很容易地移動到不同的機器上。
可擴展性
在基于容器的架構中,部署的容器數量是由開發人員預先確定的。相比之下,在無服務器架構中,后端會自動擴展以滿足需求。
繼續海運集裝箱的比喻,一家航運公司可以嘗試預測對某種產品的需求增加,然后將更多的集裝箱運送到目的地以滿足該需求,但如果有需求,它就無法打響指并生產更多裝滿貨物的集裝箱超出預期。
無服務器架構正是實現這一目標的一種方式。在計算能力方面,無服務器計算就像現代家庭的供水系統:通過打開水龍頭,消費者可以隨時獲取和使用所需的水量,并且只需為所用的水量付費。這比嘗試一次購買一個桶或一個集裝箱的水更具可擴展性。
成本
容器不斷運行,因此即使當時沒有人使用該應用程序,云提供商也必須對服務器空間收費。
無服務器架構中沒有持續的費用,因為除非調用應用程序代碼,否則它不會運行。相反,開發人員只需為其應用程序實際使用的服務器容量付費。
維護
容器托管在云中,但云提供商不會更新或維護它們。開發人員必須管理和更新他們部署的每個容器。
從開發人員的角度來看,無服務器架構無需管理后端。供應商負責運行代碼的服務器的所有管理和軟件更新。
部署時間
與無服務器功能相比,容器的初始設置時間更長,因為需要配置系統設置、庫等。配置完成后,容器只需幾秒鐘即可部署。但由于無服務器功能比容器微服務小,并且不捆綁系統依賴項,因此它們只需幾毫秒即可部署。上傳代碼后,無服務器應用程序就可以上線。
測試
很難測試無服務器 Web 應用程序,因為后端環境很難在本地環境中復制。相比之下,容器無論部署在哪里都運行相同,這使得在將基于容器的應用程序部署到生產環境之前對其進行測試相對簡單。
無服務器計算和容器有何相似之處?
兩者都是基于云的,并且都大大降低了基礎設施開銷——無服務器計算比容器更重要。在這兩種架構中,應用程序都被分解并部署為更小的組件。在基于容器的架構中,每個容器將運行一個微服務。
什么是微服務?
微服務是應用程序的一部分。每個微服務執行一項服務,多個集成的微服務組合起來組成應用程序。雖然這個名字似乎暗示微服務很小,但它們不一定是。
將應用程序構建為一組微服務的優點之一是開發人員可以一次更新一個微服務,而不是在需要進行更改時更新整個應用程序。將應用程序構建為功能的集合,就像在無服務器架構中一樣,提供了相同的好處,但在更細粒度的級別上。
開發人員應該如何在無服務器架構和容器之間做出選擇?
選擇無服務器架構的開發人員將能夠快速發布和迭代新應用程序,而不必擔心應用程序是否可以擴展。此外,如果應用程序沒有看到一致的流量或使用情況,無服務器計算將比容器更具成本效益,因為代碼不需要不斷運行。
容器讓開發人員可以更好地控制應用程序運行的環境(盡管這也需要更多的維護)以及使用的語言和庫。正因為如此,容器對于將遺留應用程序遷移到云非常有用,因為它可以更接近地復制應用程序的原始運行環境。
最后,可以使用混合架構,其中一些無服務器功能和一些部署在容器中的功能。例如,如果一個應用程序功能需要的內存比無服務器供應商分配的更多,如果一個功能太大,或者如果某些功能而不是其他功能需要長時間運行,則混合架構使開發人員能夠獲得無服務器的好處,同時仍然使用容器來實現無服務器無法支持的功能。